home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / greversi / grevvs.lzh / src / main.bak < prev    next >
Text File  |  2000-04-12  |  9KB  |  529 lines

  1. ;----------------------------------------------------------------
  2. ;    greversi.x v0.14 (2000.02.04) by M.Kamada
  3. ;    main.s メインルーチン
  4. ;----------------------------------------------------------------
  5.  
  6.     .include    doscall.mac
  7.     .include    iocscall.mac
  8.  
  9.     .include    const.equ
  10.  
  11. ;----------------------------------------------------------------
  12. ;バージョン
  13. PROGNAME    reg    'GREVERSI'
  14. LOWER_PROGNAME    reg    'greversi'
  15. VERSION        reg    '0.15'
  16. DATE        reg    '2000.04.11'
  17.  
  18. ;----------------------------------------------------------------
  19. ;プログラム開始位置
  20.     .text
  21.     .align    4,$2048
  22. prog_head::
  23.  
  24. ;----------------------------------------------------------------
  25. ;実行開始位置
  26.     .text
  27.     .align    4,$2048
  28. exec_entry:
  29.     lea.l    (16,a0),a0
  30.     suba.l    a0,a1
  31.     movem.l    a0-a1,-(sp)
  32.     DOS    _SETBLOCK
  33.     addq.l    #8,d0
  34.     tst.l    d0
  35.     bpl    @f
  36.     pea.l    (1f,pc)
  37.     DOS    _PRINT
  38.     addq.l    #4,sp
  39.     move.w    #-1,-(sp)
  40.     DOS    _EXIT2
  41. 1:    .dc.b    'メモリが不足しています',13,10,0
  42.     .even
  43. @@:
  44. ;----------------------------------------------------------------
  45. ;コマンドライン解析
  46.     lea.l    stack_area,sp
  47.  
  48.     bsr    mysrand
  49.  
  50.     sf.b    extern_name
  51.  
  52.     tst.b    (a2)+
  53.     beq    main_routine
  54.     movea.l    a2,a1
  55.  
  56. 10:    lea.l    temp,a0
  57.     bsr    getword
  58.     bmi    main_routine
  59.     beq    error_exit
  60.     move.b    (a0)+,d0
  61.     cmp.b    #'-',d0
  62.     bne    40f
  63.     bra    30f
  64.  
  65. 20:    cmpi.b    #' ',(a0)
  66.     bls    10b
  67. 30:    moveq.l    #$20,d0
  68.     or.b    (a0)+,d0
  69.  
  70. 9:    cmp.b    #'l',d0
  71.     bne    9f
  72.     bsr    stou
  73.     bcs    error_exit
  74.     cmp.w    #1,d0
  75.     blo    error_exit
  76.     cmp.w    #5,d0
  77.     bhi    error_exit
  78.     move.w    d0,level
  79.     bra    20b
  80.  
  81. 9:    cmp.b    #'m',d0
  82.     bne    9f
  83.     bsr    stou
  84.     bcs    error_exit
  85.     cmp.w    #4,d0
  86.     bcc    error_exit
  87.     move.w    d0,mode
  88.     bra    20b
  89.  
  90. 9:    cmp.b    #'q',d0
  91.     bne    9f
  92.     st.b    quick_exec
  93.     bra    20b
  94.  
  95. 9:    cmp.b    #'x',d0
  96.     bne    9f
  97.     tst.b    (a0)
  98.     bne    1f
  99.     lea.l    temp,a0
  100.     bsr    getword
  101.     bmi    error_exit
  102.     beq    error_exit
  103. 1:    bsr    init_extern
  104.     bmi    error_exit
  105.     bra    10b
  106.  
  107. 9:
  108.     bra    error_exit
  109.  
  110. 40:
  111.  
  112. ;----------------------------------------------------------------
  113. ;サブルーチンモード
  114. ;    コマンドラインで指定された盤の状態と手番から次の1手を求め,
  115. ;    終了コードで返す
  116.     moveq.l    #B,d6
  117.     moveq.l    #W,d7
  118.     cmp.b    #'0',d0
  119.     beq    @f
  120.     exg.l    d6,d7
  121.     cmp.b    #'1',d0
  122.     bne    error_exit
  123. @@:    tst.b    (a0)
  124.     bne    error_exit
  125.  
  126.     lea.l    temp,a0
  127.     bsr    getword
  128.  
  129.     lea.l    ban+P11,a1
  130.     moveq.l    #8-1,d2
  131. 2:    moveq.l    #8-1,d1
  132. 1:    move.b    (a0)+,d0
  133.     beq    error_exit
  134.     moveq.l    #B,d3
  135.     cmp.b    #'0',d0
  136.     beq    @f
  137.     moveq.l    #W,d3
  138.     cmp.b    #'1',d0
  139.     beq    @f
  140.     moveq.l    #S,d3
  141. @@:    move.b    d3,(a1)+
  142.     dbra    d1,1b
  143.     addq.l    #1,a1
  144.     dbra    d2,2b
  145.     lea.l    put_list_top,a5        ;置ける位置のリストの先頭
  146.     lea.l    put_record_btm,a6    ;レコードの末尾
  147.     bsr    count_ban
  148.     beq    error_exit        ;どこにも置けない
  149.     move.w    level,d0
  150.     bsr    think
  151.     divu.w    #9,d0
  152.     subq.w    #1,d0            ;縦
  153.     move.w    d0,d1
  154.     swap.w    d0
  155.     subq.w    #1,d0            ;横
  156.     lsl.w    #3,d1
  157.     add.w    d1,d0
  158.     move.w    d0,-(sp)
  159.     DOS    _EXIT2
  160.  
  161. ;----------------------------------------------------------------
  162. error_exit:
  163.     pea.l    (m_errmes,pc)
  164.     DOS    _PRINT
  165.     addq.l    #4,sp
  166.     move.w    #-1,-(sp)
  167.     DOS    _EXIT2
  168.  
  169. m_errmes:    .dc.b    PROGNAME,'.X v',VERSION,' (',DATE,') by M.Kamada',13,10
  170.         .dc.b    '使用法: ',LOWER_PROGNAME,' [スイッチ]',13,10
  171.         .dc.b    'スイッチ:',13,10
  172.         .dc.b    '  -lN',9,'レベル(N=1~5,大きいほど強い)[1]',13,10
  173.         .dc.b    '  -mN',9,'モード(N=0~3)[2]',13,10
  174.         .dc.b    9,'0=man-man,1=com-man,2=man-com,3=com-com',13,10
  175.         .dc.b    0
  176.     .even
  177.  
  178.     .data
  179. quick_exec:    .dc.b    0
  180. think_extern:    .dc.b    0
  181. extern_quick:    .dc.b    0
  182.  
  183.     .bss
  184. temp:    .ds.b    256
  185.  
  186. ;----------------------------------------------------------------
  187. ;<a0.l:思考ルーチンの指定("greversi -l5"など)
  188.     .text
  189.     .even
  190. init_extern:
  191.     movem.l    d1-d7/a0-a6,-(sp)
  192.     movea.l    a0,a1
  193.     lea.l    extern_name,a0
  194.     bsr    strcpy
  195.     clr.l    -(sp)
  196.     pea.l    extern_param
  197.     pea.l    extern_name
  198.     move.w    #2,-(sp)
  199.     DOS    _EXEC
  200.     lea.l    (14,sp),sp
  201.     tst.l    d0
  202.     bmi    90f
  203.  
  204. .if 0
  205.     tst.b    quick_exec
  206.     beq    10f
  207.     clr.w    -(sp)
  208.     pea.l    extern_name
  209.     DOS    _OPEN
  210.     addq.l    #6,sp
  211.     move.l    d0,d1
  212.     bmi    10f
  213.     pea.l    64.w
  214.     pea.l    extern_quick_header
  215.     move.w    d1,-(sp)
  216.     DOS    _READ
  217.     move.l    d0,d2
  218.     DOS    _CLOSE
  219.     addq.l    #6,sp
  220.     cmp.l    (sp)+,d2
  221.     bne    10f
  222.     lea.l    extern_quick_header,a0
  223.     cmp.w    #'HU',(a0)
  224.     bne    10f
  225.     move.l    (12,a0),d0        ;text
  226.     add.l    (16,a0),d0        ;data
  227.     add.l    #240,d0            ;pdb
  228.     move.l    d0,extern_quick_pdbtextdata
  229.     move.l    (20,a0),d1        ;bss
  230.     move.l    d1,extern_quick_bss
  231.     add.l    d0,d1
  232.     move.l    d1,extern_quick_size
  233.     move.l    d0,-(sp)
  234.     move.w    #2,-(sp)
  235.     DOS    _MALLOC2
  236.     addq.l    #6,sp
  237.     move.l    d0,think_swap
  238.     bmi    10f
  239.     clr.l    -(sp)
  240.     pea.l    extern_param
  241.     pea.l    extern_name
  242.     move.w    #1,-(sp)
  243.     DOS    _EXEC
  244.     lea.l    (14,sp),sp
  245.     tst.l    d0
  246.     bmi    90f
  247.     movem.l    d0-d7/a0-a6,extern_quick_regs
  248.     lea.l    (16,a0)
  249.  
  250.     movem.l    extern_quick_regs,d0-d7/a0-a6
  251.     lea.l    (dummy_exit,pc),a4
  252.     move.l    a4,-(sp)
  253.     move.w    #4,-(sp)
  254.     DOS    _EXEC
  255.     addq.l    #6,sp
  256.     st.b    extern_quick
  257. 10:
  258. .endif
  259.     st.b    think_extern
  260.  
  261.     moveq.l    #0,d0
  262. 99:    movem.l    (sp)+,d1-d7/a0-a6
  263.     rts
  264.  
  265. 90:    moveq.l    #-1,d0
  266.     bra    99b
  267.  
  268. dummy_exit:
  269.     DOS    _EXIT
  270.  
  271.     .bss
  272. extern_name:    .ds.b    256
  273. extern_param:    .ds.b    256
  274.     .even
  275. extern_quick_header:    .ds.b    64
  276. extern_quick_pdbtextdata:    .ds.l    1
  277. extern_quick_bss:    .ds.l    1
  278. extern_quick_size:    .ds.l    1
  279. extern_quick_regs:    .ds.l    15
  280.  
  281. ;----------------------------------------------------------------
  282.     .text
  283.     .even
  284. exec_extern:
  285.     movem.l    d1-d7/a0-a6,-(sp)
  286. ;コマンドラインを作る
  287.     lea.l    extern_p+1,a0
  288.     lea.l    extern_param+1,a1
  289.     bsr    strcpy
  290.     move.b    #' ',(a0)+
  291.     moveq.l    #'0',d0
  292.     cmp.b    #'B',d6
  293.     beq    @f
  294.     moveq.l    #'1',d0
  295. @@:    move.b    d0,(a0)+
  296.     move.b    #' ',(a0)+
  297.     lea.l    ban+P11,a1
  298.     moveq.l    #8-1,d2
  299. 2:    moveq.l    #8-1,d1
  300. 1:    move.b    (a1)+,d3
  301.     moveq.l    #'0',d0
  302.     cmp.b    #W,d3
  303.     beq    @f
  304.     moveq.l    #'1',d0
  305.     cmp.b    #B,d3
  306.     beq    @f
  307.     moveq.l    #'2',d0
  308. @@:    move.b    d0,(a0)+
  309.     dbra    d1,1b
  310.     addq.l    #1,a1
  311.     dbra    d2,2b
  312.     sf.b    (a0)
  313.     move.l    a0,d0
  314.     sub.l    #extern_p+1,d0
  315.     move.b    d0,extern_p
  316. ;
  317.     clr.l    -(sp)
  318.     pea.l    extern_p
  319.     pea.l    extern_name
  320.     clr.w    -(sp)
  321.     DOS    _EXEC
  322.     lea.l    (14,sp),sp
  323.     tst.l    d0
  324.     bmi    90f
  325.  
  326.     cmp.l    #64,d0
  327.     bcc    90f
  328.     move.w    d0,d1
  329.     lsr.w    #3,d1
  330.     add.w    d1,d0
  331.     add.w    #10,d0
  332.     tst.l    d0
  333. 99:    movem.l    (sp)+,d1-d7/a0-a6
  334.     rts
  335.  
  336. 90:    moveq.l    #-1,d0
  337.     bra    99b
  338.  
  339. .if 0
  340.     move.l    -8(a4),-(sp)        *リミットアドレス
  341.     move.l    a4,-(sp)        *ロードアドレス
  342.     pea.l    (filename)r        *ファイル名
  343.     move.w    #3,-(sp)
  344.     DOS    _EXEC            *実際に読み込む
  345.     lea.l    14(sp),sp
  346. .endif
  347.  
  348.     .bss
  349. extern_p:    .ds.b    256
  350.  
  351. ;----------------------------------------------------------------
  352. ;メインルーチンモード
  353. ;    盤の状態を表示してゲームを行う
  354.     .text
  355.     .even
  356. main_routine:
  357.     move.w    #-1,-(sp)
  358.     DOS    _BREAKCK
  359.     move.w    d0,breakck_mode
  360.     move.w    #1,-(sp)        ;break on
  361.     DOS    _BREAKCK
  362.     addq.l    #2,sp
  363.  
  364.     lea.l    (main,pc),a0
  365.     bsr    takeback
  366.  
  367.     bsr    tini_screen
  368.  
  369.     move.w    breakck_mode,-(sp)
  370.     bmi    @f
  371.     DOS    _BREAKCK
  372. @@:    addq.l    #2,sp
  373.  
  374.     DOS    _EXIT
  375.  
  376. ;----------------------------------------------------------------
  377. ;メインルーチン
  378. main:
  379.     bsr    init_screen
  380.     sf.b    no_menu
  381. game_loop:
  382.     bsr    init_graph
  383.     bsr    init_think
  384.  
  385.     moveq.l    #B,d6            ;自分の石
  386.     moveq.l    #W,d7            ;相手の石
  387.  
  388.     lea.l    put_list_top,a5        ;置ける位置のリストの先頭
  389.     lea.l    put_record_btm,a6    ;レコードの末尾
  390.  
  391.     bsr    draw_ban
  392.     bsr    draw_black_count
  393.     bsr    draw_white_count
  394.  
  395.     clr.w    turn_count
  396.  
  397.     bsr    draw_turn        ;手番を表示する
  398.  
  399.     tst.b    no_menu
  400.     bne    @f
  401.     bsr    draw_menu
  402.     beq    main_exit
  403. @@:
  404.  
  405. main_loop:
  406.     DOS    _KEYSNS
  407.     bsr    count_ban
  408.     beq    main_pass        ;パス
  409.  
  410.     bsr    draw_turn        ;手番を表示する
  411.  
  412. main_loop1:
  413.     move.w    mode,d0
  414.     beq    main_man
  415.     moveq.l    #B,d1
  416.     subq.w    #2,d0
  417.     blo    @f
  418.     bhi    main_com
  419.     moveq.l    #W,d1
  420. @@:    cmp.b    d1,d6
  421.     beq    main_com
  422.  
  423. ;人間の手番のときマウスで入力させる
  424. main_man:
  425.     st.b    turn_man
  426.     sf.b    turn_com
  427. @@:    bsr    input_pos
  428.     bmi    main_menu
  429.     cmp.w    #255,d0
  430.     beq    @b            ;盤の外
  431.     lea.l    ban,a0
  432.     adda.l    d0,a0
  433.     tst.b    (a0)
  434.     bne    @b            ;石があるので置けない
  435.     bsr    put_record_one        ;石を置く
  436.     beq    @b            ;ひっくり返せないので置けない
  437.     bsr    tup_draw        ;表示する
  438.     bra    main_next
  439.  
  440. main_menu:
  441. @@:    IOCS    _MS_GETDT
  442.     tst.b    d0
  443.     bne    @b
  444.     bsr    draw_menu
  445.     beq    main_exit        ;終了
  446.     bmi    main_loop1        ;キャンセル
  447. ;対局
  448.     tst.w    turn_count
  449.     beq    main_loop1
  450.     st.b    no_menu
  451.     bra    game_loop
  452.  
  453. ;コンピュータの手番のとき
  454. main_com:
  455.     sf.b    turn_man
  456.     st.b    turn_com
  457.     IOCS    _MS_GETDT
  458.     tst.b    d0
  459.     bne    main_menu
  460.  
  461.     tst.b    think_extern
  462.     bne    1f
  463.     move.w    level,d0
  464.     bsr    think
  465.     bra    2f
  466. 1:    bsr    exec_extern
  467.     bmi    main_menu
  468. 2:
  469.     lea.l    ban,a0
  470.     adda.l    d0,a0
  471.     bsr    put_record_one        ;石を置く
  472.     beq    main_menu
  473.     bsr    tup_draw        ;表示する
  474. ;相手の手番に移る
  475. main_next:
  476.     exg.l    d6,d7
  477.     addq.w    #1,turn_count
  478.     bra    main_loop
  479.  
  480. ;パスのとき
  481. main_pass:
  482. ;相手の手番に移る
  483.     exg.l    d6,d7
  484.     bsr    count_ban        ;相手は置けるか
  485.     beq    main_over        ;両方ともパスなので終局
  486.     exg.l    d6,d7
  487.  
  488.     bsr    draw_turn        ;手番を表示する
  489.     bsr    draw_pass
  490.     exg.l    d6,d7
  491.     bra    main_loop
  492.  
  493. ;終局
  494. main_over:
  495.     sf.b    no_menu
  496.     bsr    draw_over
  497.     bmi    main_exit
  498.     move.w    mode,d0
  499.     beq    game_loop
  500.     cmp.w    #3,d0
  501.     beq    game_loop
  502.     eori.w    #3,d0
  503.     move.w    d0,mode
  504.     bra    game_loop
  505.  
  506. main_exit:
  507.     rts
  508.  
  509.     .data
  510.     .even
  511. level::        .dc.w    1        ;1~5
  512. mode::        .dc.w    2        ;0=man-man,1=com-man,2=man-com,3=com-com
  513. breakck_mode:    .dc.w    -1        ;_BREAKCKの元のモード
  514.  
  515.     .bss
  516. turn_man::    .ds.b    1
  517. turn_com::    .ds.b    1
  518. no_menu:    .ds.b    1        ;-1=ゲーム開始時にメニューを表示しない
  519.     .even
  520. turn_count::    .ds.w    1        ;手番カウンタ(0=先攻の最初の1手)
  521.  
  522.     .stack
  523.     .align    4
  524.         .ds.b    16384        ;スタックエリア
  525. stack_area:
  526.  
  527. ;----------------------------------------------------------------
  528.     .end    exec_entry
  529.